﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using Sauvegarde;


namespace Modele
{
    public class Modele
    {
            /**
            * @author PAN
            * @date Juin 2010
            * @brief La classe Modele est la classe qui contrôle les données
            */


        /***************/
        /** attributs **/
        /***************/
        private general.Logiciel logiciel;

        private ProjetBlocNote pjbn; 
        private ProjetBlocNote blocnote;

        private ProjetBlocNote projet_courant; // soit pjbn soir blocnote

        /***************/
        /**  méthodes **/
        /***************/

        /**
         * getEtatsCalques()
         * 
       * @brief permet d'obtenir le list de bool correspondant aux calque et à leur état associé
       * @return List<bool>
       */
        public List<bool> getEtatsCalques()
        {
            return projet_courant.getEtatsCalques();
        }

        //constructeur
        /**
         * Modele(general.Logiciel _logiciel)
         * 
       * @brief Constructeur
       */
        public Modele(general.Logiciel _logiciel)
        {
            logiciel = _logiciel;
            pjbn = new ProjetBlocNote();
            System.Drawing.Bitmap image_bloc_note =new System.Drawing.Bitmap(global::projet_PAN.Properties.Resources.image_blocnote);
            blocnote = new ProjetBlocNote(image_bloc_note);
            

            //par defaut on ouvrir le logiciel sur le projet et non le blocnote   
            projet_courant = pjbn;
        }

        /**
         * addStroke(Microsoft.Ink.Stroke _stroke)
         * 
        * @brief ajoute un stroke au calque courant
         * @param Microsoft.Ink.Stroke _stroke
        * @return List<Microsoft.Ink.Stroke>
        */
        public List<Microsoft.Ink.Stroke> addStroke(Microsoft.Ink.Stroke _stroke)
        {
            return projet_courant.add(_stroke);
        }

        /**
         * deleteStroke(Microsoft.Ink.Stroke _stroke)
         * 
        * @brief
        * @return void
        */
        /*
        public void deleteStroke(Microsoft.Ink.Stroke _stroke)
        {
            projet_courant.delete(_stroke);
        }
        */


        /**
         * addInk(Microsoft.Ink.Ink _ink, Microsoft.Ink.DrawingAttributes _attributes)
         * 
        * @brief ajoute un  ink au calque courant
         * @param Microsoft.Ink.Ink _ink
         * @param Microsoft.Ink.DrawingAttributes _attributes
        * @return List<Microsoft.Ink.Stroke> 
        */
        public List<Microsoft.Ink.Stroke> addInk(Microsoft.Ink.Ink _ink, Microsoft.Ink.DrawingAttributes _attributes)
        {
            return projet_courant.add(_ink, _attributes);
        }

        /**
         * addBalise(Balise _balise)
         * 
        * @brief ajoute une Balise au calque courant
        * @return void
        */
        public void addBalise(Balise _balise)
        {
            projet_courant.add(_balise);
        }



        /**
         * analyserStroke(Microsoft.Ink.Stroke _stroke)
         * 
        * @brief demande au logiciel de reconnaitre un stroke
         * @param Microsoft.Ink.Stroke _stroke
        * @return bool reconnu : indique si le stroke a été reconnu ou non
        * /!\ A COMPLETER
        */
        public bool analyserStroke(Microsoft.Ink.Stroke _stroke)
        {
            Console.WriteLine("Reconnaissance du trait.....");

            // si reconnu, on l'ajoute au modèle et on rend true
            // sinon on rend false

            return false;
        }

        /********************
        * FONCTIONS D'ACCES *
        *********************/

        /**
         * getCalqueCourant()
         * 
        * @brief rend le calque courant
        * @return Calque : le calque courant
        */
        public Calque getCalqueCourant()
        {
            return projet_courant.getCalqueCourant();
        }

        /**
         * getCombinedInk()
         * 
        * @brief rend le Ink contenant les Strokes de tous les calques non courants
        * @return Microsoft.Ink.Ink : l'Ink contenant les Strokes de tous les calques non courants
        */
        public Microsoft.Ink.Ink getCombinedInk()
        {
            return projet_courant.getCombinedInk();
        }

        /**
         * getCombinedAnnotations()
         * 
        * @brief
        * @return ArrayList
        */
        public ArrayList getCombinedAnnotations()
        {
            return projet_courant.getCombinedAnnotations();
        }

        /**
         * getCombinedTexte()
         * 
        * @brief rend la liste contenant les textes de tous les calques non courants
        * @return ArrayList : contenant les textes de tous les calques non courants
        */
        public ArrayList getCombinedTexte()
        {
            return projet_courant.getCombinedTexte();
        }



        /**
         * changeVisibility(int numero_calque)
         * 
        * @brief permet e changer la visibilté du calque d'indice passé en paramètre
         * @param int numero_calque
        * @return void
        */
        public void changeVisibility(int numero_calque)
        {
            projet_courant.changeVisibility(numero_calque);
        }

        /**
         * deleteStroke(Microsoft.Ink.Stroke _stroke)
         * 
        * @brief supprime le stroke dans le calque courant
        * @return bool réussi : si le stroke a été supprimé
        */
        public void deleteStroke(Microsoft.Ink.Stroke _stroke)
        {
            projet_courant.deleteStroke(_stroke);
        }

        /**
         * getProjet()
         * 
         * @brief accesseur à l'attribut projet_courant
         * @return ProjetBlocNote 
         */
        public ProjetBlocNote getProjet()
        {
            return projet_courant;
        }

        /**
         * setProjet(ProjetBlocNote p)
         * 
         * @brief setteur pour l'attribut projet_courant
         * @param ProjetBlocNote p
         * @return void
         */
        public void setProjet(ProjetBlocNote p)
        {
            projet_courant = p;
        }


        /**
         * sauver(String nomFichier)
         * 
         * @brief permet d'appeller la sauvegarde sur un fichier
         * @param String nomFichier
         * @return void
         */
        public void sauver(String nomFichier)
        {
            writer1 w = new writer1(this);
            w.ecrireUPX(nomFichier);
        }


        /**
         * ouvrir(String nomFichier)
         * 
         * @brief permet d'ouvrir un fichier
         * @param String nomFichier
         * @return System.Drawing.Bitmap : l'image de fond
         */
        public System.Drawing.Bitmap ouvrir(String nomFichier)
        {
            reader1 r = new reader1(this);
            return r.lireUPX(nomFichier);
        }


        //mise a jour de la sdd (document)
        /**
        * ajouterDocument(System.Drawing.Bitmap document)
        * 
        * @brief ajoute un document en image de fond
        * @param System.Drawing.Bitmap document
        * @return void
        */
        public void ajouterDocument(System.Drawing.Bitmap document)
        {
           projet_courant.ajouterDocument(document);
        }

        //GESTION DU BLOCNOTE
        /**
        * changer_vers_blocnote()
         * 
        * @brief changer le projet courant vers le bloc-note
        * @return System.Drawing.Bitmap
        */
        public System.Drawing.Bitmap changer_vers_blocnote()
        {
            projet_courant = blocnote;
            return blocnote.getImagePageCourant();
        }

        //switch vers le projet
        /**
        * changer_vers_projet()
         * 
        * @brief changer le projet courant vers le projet
        * @return System.Drawing.Bitmap
        */
        public System.Drawing.Bitmap changer_vers_projet()
        {
            projet_courant = pjbn;
            return pjbn.getImagePageCourant();
        }

        //GESTION DES NOMS DES CALQUES 
        /**
        * getNoms()
         * 
        * @brief getter sur les noms des calques
        * @return List<string>
        */
        public List<string> getNoms()
        {
            return projet_courant.getNoms();
        }
        //retourne le nom du calque numero i
        /**
        * getNom(int i)
        * 
        * @brief getter sur le nom du calque d'indice i
        * @param int i
        * @return string
        */
        public string getNom(int i)
        {
            return projet_courant.getNom(i);
        }

        //change le nom du claque numero i 
        /**
        * setNom(int i, string _nom)
        * 
        * @brief setter sur le nom du calque d'indice i
        * @param int i
         * @param string _nom
        * @return void
        */
        public void setNom(int i, string _nom)
        {
            projet_courant.setNom(i, _nom);
        }

        
        /**
        * setNom(string _nom)
        * 
        * @brief setter sur le nom du calque courant
         * @param string _nom
        * @return void
        */
        public void setNom(string _nom)
        {
            projet_courant.setNom(_nom);
        }


        /**
       * addBibliothequeBalise(Balise _balise, System.Drawing.Bitmap new_image_balise)
       * 
       * @brief ajout de la balise et de l'image en grande qualité dans la bibliothèque de la sdd
       * @param Balise _balise
       * @param System.Drawing.Bitmap new_image_balise
       * @return void
       */
        public void addBibliothequeBalise(Balise _balise, System.Drawing.Bitmap new_image_balise)
        {
            pjbn.addBibliothequeBalise(_balise, new_image_balise);
        }


        /**
         * sendUtilisateur(string _prenom, string _nom)
         * 
        * @brief remontée de l'utilisateur
        * @param string _prenom : le prénom de l'utilisateur
        * @param string _nom : le nom de l'utilisateur
        * @return ArrayList : la liste de tous les utilisateurs enregistrés
        */
        public ArrayList sendUtilisateur(string _prenom, string _nom)
        {
            if (_prenom != "" && _nom != "")
            {
                pjbn.setAuthor(_prenom + " " + _nom);
            }
            return pjbn.getAuthors();
        }

        /**
         * addKeyWord(string _dialogue)
         * 
        * @brief ajoute un mot-clef à la liste de mot-clefs
         * @param string _dialogue
        * @return ArrayList listKeyWords : la liste des mot-clefs du modèle
        */
        public ArrayList addKeyWord(string _dialogue)
        {
            if (_dialogue != "")
            {
                pjbn.setKeyWord(_dialogue);
            }
            Console.WriteLine("count de la liste de KW : {0}", pjbn.getKeyWords().Count);
            return pjbn.getKeyWords();
        }

        /**
        * setBibliImages(List<System.Drawing.Bitmap> images_balises)
        * 
       * @brief instancie la bibliotèque d'images de balises avec la liste passé en paramètre
       * @param List<System.Drawing.Bitmap> images_balises
       * @return void
       */
        public void setBibliImages(List<System.Drawing.Bitmap> images_balises)
        {
            projet_courant.setBibliImages(images_balises);
        }

        /**
       * setBibliBalises(List<Balise> balises)
         * 
      * @brief instancie la bibliotèque de balises avec la liste passé en paramètre
      * @param List<Balise> balises
      * @return void
      */
        public void setBibliBalises(List<Balise> balises)
        {
            projet_courant.setBibliBalises(balises);
        }

        /**
      * getBibliImages()
      * 
     * @brief getter sur le bibliotèque d'images de balises
     * @return List<System.Drawing.Bitmap>
     */
        public List<System.Drawing.Bitmap> getBibliImages()
        {
            return projet_courant.getBibliImages();
        }

        /**
     * getBibliBalises()
     * 
    * @brief getter sur le bibliotèque de balises
    * @return List<Balise>
    */
        public List<Balise> getBibliBalises()
        {
            return projet_courant.getBibliBalises();
        }

    }
}
